<?php

require_once __DIR__ . '/../../vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$vhost = ''; //项目队列隔离使用
$queueName = 'msgs'; //队列名称
$exchangeName = 'kd_sms_send_ex'; //交换机名
$routingKey = 'sms_send'; //路由关键字(也可以省略)

//建立生产者与mq之间的连接
//参数：地址，端口，账号，密码
//$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$connection = new AMQPStreamConnection(
    '120.25.227.106',
    5672,
    'guest',  //user
    'guest',  //password
    '/'  //vhost
);

//在已连接基础上建立生产者与mq之间的通道
$channel = $connection->channel();

//声明初始化交换机
//参数：交换机名，路由类型，是否检测同名队列，是否开启队列持久化，通道关闭后是否删除队列
$channel->exchange_declare($exchangeName, 'direct', false, true, false);

//声明初始化队列
//参数：队列名，是否检测同名队列，是否开启队列持久化，是否能被其他队列访问，通道关闭后是否删除队列
$channel->queue_declare($queueName, false, true, false, false);

//将队列与某个交换机进行绑定，并使用路由关键字
//参数：队列名，交换机名，路由键名
$channel->queue_bind($queueName, $exchangeName, $routingKey);

//循环发送十条消息到队列中
for ($i = 0; $i < 10; $i++) {
    $data = [
        'id' => 'message_' . $i,
        'order_id' => str_replace('.', '', microtime(true)) . mt_rand(10, 99) . $i,
        'time' => time()
    ];
    $data = json_encode($data);

    //创建消息，设置rabbitMq重启后也不会丢失队列，或者设置为'delivery_mode' => 2
    $msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);

    //推送消息到某个交换机
    //参数：消息，交换机名，路由键名
    //$channel->basic_publish($msg);
    $channel->basic_publish($msg, $exchangeName, $routingKey);

    echo 'Send message: ' . $i . PHP_EOL;
}

echo " [x] Send Done!'\n";

$channel->close();
$connection->close();